﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SQLite;
using System.Data.SqlClient;
using System.Diagnostics;

namespace CSharp_lp1415_5958_3958
{
    using GraphLib;

    /// <summary>
    ///  Classe responsável por criar gráfico Remuneração Minima mensal dos funcionários públicos
    /// </summary>
    public partial class FormGraphRemMin : Form
    {
        private int NumGraphs = 1;
        private string CurColorShema = "LIGHT_BLUE";

        /// <summary>
        ///  Método para verificar se a Base de Dados existe, pois pode acontecer de não estar criada dando erro
        /// </summary>
        private SQLiteConnection OpenConnection()
        {
            string dbFile = "DataBase.db";
            SQLiteConnection conn = new SQLiteConnection("Data Source=" + dbFile + ";Version=3;");
            conn.Open();
            return conn;
        }

        /// <summary>
        ///  Construtor da classe responsável por criar gráfico Remuneração Minima mensal, recebe como parametro o Ano inicial e final da pesquisa
        /// </summary>
        public FormGraphRemMin(string srtAno1, string srtAno2)
        {
            InitializeComponent();
            this.Ano1 = srtAno1;
            textBox1.Text = Ano1;

            this.Ano2 = srtAno2;
            textBox2.Text = Ano2;

            CalcDataGraphs();
            display.Refresh();  
        }

        /// <summary>
        ///  Método para pegar e setar o Ano Inicial da pesquisa
        /// </summary>
        public string Ano1 { get; set; }

        /// <summary>
        ///  Método para pegar e setar o Ano Final da pesquisa
        /// </summary>
        public string Ano2 { get; set; }

        /// <summary>
        ///  Método para aplicacar cor ao gráfico
        /// </summary>
        private void ApplyColorSchema()
        {
            switch (CurColorShema)
            {
                case "LIGHT_BLUE":
                    {
                        Color[] cols = { Color.DarkRed, 
                                         Color.DarkSlateGray,
                                         Color.DarkCyan, 
                                         Color.DarkGreen, 
                                         Color.DarkBlue ,
                                         Color.DarkMagenta,                              
                                         Color.DeepPink };

                        for (int j = 0; j < NumGraphs; j++)
                        {
                            display.DataSources[j].GraphColor = cols[j % 7];
                        }

                        display.BackgroundColorTop = Color.White;
                        display.BackgroundColorBot = Color.FromArgb(183, 183, 255);
                        display.SolidGridColor = Color.Blue;
                        display.DashedGridColor = Color.Blue;
                    }
                    break;
            }
        }

        /// <summary>
        ///  Método para calcular as componentes gráficas do gráfico bem como as suas variáveis estatisticas 
        /// </summary>
        public void CalcDataGraphs()
        {
            this.SuspendLayout();
            display.DataSources.Clear();
            display.SetDisplayRangeX(1977,2013);
            SQLiteConnection connection = OpenConnection();
            SQLiteCommand command = connection.CreateCommand();
            string query = "select count(*) from Ipcportugal where ano between "+this.textBox1.Text+" and "+this.textBox2.Text;
            command.CommandText = query;
            command.CommandType = CommandType.Text;
            int RowCount = 0;
            RowCount = Convert.ToInt32(command.ExecuteScalar());
            query = "SELECT Ano, Remuneracao_Minima_Mensal FROM Ipcportugal WHERE Ano between " + this.textBox1.Text + " and " + this.textBox2.Text;
            command.CommandText = query;
            SQLiteDataReader r = command.ExecuteReader();
            
            display.DataSources.Add(new DataSource());
            display.DataSources[0].Name = "Ipcportugal ";
            display.DataSources[0].OnRenderXAxisLabel += RenderXLabel;
            this.Text = "Remuneração mínima mensal dos funcionários";
            display.DataSources[0].Length = RowCount;
            display.PanelLayout = PlotterGraphPaneEx.LayoutMode.NORMAL;
            display.DataSources[0].AutoScaleY = false;
            display.DataSources[0].AutoScaleX = false;
            display.DataSources[0].SetDisplayRangeY(0, 600);
            display.DataSources[0].SetGridDistanceY(100);
            display.DataSources[0].XAutoScaleOffset = 1000;
            display.SetGridOriginX(1000);
            display.DataSources[0].OnRenderYAxisLabel = RenderYLabel;
            int i = 0;
            while (r.Read())
            {
                Debug.WriteLine(r["Ano"] + " -> " + r["Remuneracao_Minima_Mensal"]);
                display.DataSources[0].Samples[i].x = Convert.ToSingle(r["Ano"]);
                display.DataSources[0].Samples[i].y = Convert.ToSingle(r["Remuneracao_Minima_Mensal"]);
                i++;
            }
            ApplyColorSchema();
            this.ResumeLayout();
            display.Refresh();
        }

        /// <summary>
        ///  Método para calcular e renderizar o labe do eixo do X 
        /// </summary>
        private String RenderXLabel(DataSource s, int idx)
        {
            if (s.AutoScaleX)
            {
                if (idx % 2 == 0)
                {
                    int Value = (int)(s.Samples[idx].x);
                    return "" + Value;
                }
                return "";
            }
            else
            {
                int Value = (int)(s.Samples[idx].x);
                String Label = "Ano" + Value;
                return Label;
            }
        }

        /// <summary>
        ///  Método para calcular e renderizar o labe do eixo do Y 
        /// </summary>
        private String RenderYLabel(DataSource s, float value)
        {
            return String.Format("{0:0.0}", value);
        }

        /// <summary>
        ///  Método para encerrar o display, objecto onde mostra o gráfico
        /// </summary>
        protected override void OnClosing(CancelEventArgs e)
        {
            display.Dispose();

            base.OnClosing(e);
        }
    }
}
